package com.ruoyi.project.lab.controller;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.security.ShiroUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.jiaowu.classtime.domain.TbClassTime;
import com.ruoyi.project.jiaowu.classtime.mapper.TbClassTimeMapper;
import com.ruoyi.project.lab.domain.Lab;
import com.ruoyi.project.lab.domain.LabAddParam;
import com.ruoyi.project.lab.domain.LabDateParam;
import com.ruoyi.project.lab.service.LabService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.print.attribute.IntegerSyntax;
import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Controller
@RequestMapping("/lab")
public class LabController extends BaseController {

    @Autowired
    private LabService labService;

    private String prefix = "system/lab";

    @RequiresPermissions("lab:view")
    @GetMapping()
    public String dept()
    {
        return prefix + "/lab";
    }

    @RequiresPermissions("lab:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(Lab lab) {
        System.out.println("post请求进入...");
//        List<Lab> labList = deptService.selectDeptList(dept);
//        return deptList;
        startPage();
        List<Lab> list = labService.selectlabList(lab);
        return getDataTable(list);
    }

    /**
     * 进入新增实验室页面
     */
    @GetMapping("/add")
    public String add(ModelMap mmap)
    {
        TbClassTime tbClassTime=new TbClassTime();
        tbClassTime.setSection("第一节");
        tbClassTime.setSection("第二节");
        tbClassTime.setSection("第3节");
        tbClassTime.setSection("第4节");
        tbClassTime.setSection("第5节");
        mmap.put("tbClassTime", tbClassTime);//没用
        return prefix + "/add";
    }

    /**
     * 新增测试框架数据
     */
    @RequiresPermissions("lab:add")
    @Log(title = "实验室管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(LabAddParam labAddParam) {
        System.err.println(labAddParam);
        //判断添加实验时,是否添加开放时间
        if(labAddParam.getExperimentBeginDate()==null){
            return AjaxResult.error("添加实验室时,请添加开放时间");
        }else{
            System.out.println("获取新增实验室数据的请求"+labAddParam);
            System.err.println(getLoginName());
            labAddParam.setUserName(getLoginName());
            return labService.addSave(labAddParam);
        }
    }

    /**
     * 导出test列表
     */
    @Log(title = "实验室管理", businessType = BusinessType.EXPORT)
    @RequiresPermissions("lab:export")
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(Lab lab)
    {
        List<Lab> list = labService.selectlabList(lab);
        ExcelUtil<Lab> util = new ExcelUtil<Lab>(Lab.class);
        return util.exportExcel(list, "实验室管理");
    }

    @RequiresPermissions("lab:remove")
    @Log(title = "实验室管理", businessType = BusinessType.DELETE)
    @PostMapping("/removeAll")
    @ResponseBody
    public AjaxResult removeAll(String ids) {
        try {
            return toAjax(labService.deleteById(ids));
        }
        catch (Exception e) {
            return error(e.getMessage());
        }
    }

    /**
     * 修改实验数据
     */
    @GetMapping("/edit/{id}")
    public String edit(@PathVariable("id") Long id, ModelMap mmap)
    {
        Lab lab = labService.selectLabById(id);
        mmap.put("lab", lab);
        return prefix + "/edit";
    }

    /**
     * 修改保存实验数据
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "实验室管理", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(@Validated Lab lab) {
        System.out.println("修改实验数据的post请求到达"+lab);
        return toAjax(labService.updateLab(lab));
    }


    /**
     * 修改实验室开放状态
     */
    @RequiresPermissions("system:role:edit")
    @GetMapping("/guanbi")
    @ResponseBody
    public AjaxResult editGuanbi(Long id){
        return toAjax(labService.editGuanbi(id));
    }
    @RequiresPermissions("system:role:edit")
    @GetMapping("/kaifang")
    @ResponseBody
    public AjaxResult editKaifang(Long id){
        //System.out.println(id);
        return toAjax(labService.editKaifang(id));
    }


    @PostMapping("/list2")
    @ResponseBody
    public TableDataInfo list(LabDateParam labDateParam) {
        startPage();
        List<LabDateParam> list=labService.getAllLabDate(labDateParam);
        return getDataTable(list);
    }


    /**
     *修改实验室莫一天的具体信息
     * @param mess
     * @return
     */
    @GetMapping("/editadd")
    @ResponseBody
    public AjaxResult listsca(String mess) {
        String[] str=mess.split(",");
        Map<String,Object> map=new HashMap<>();
        //System.out.println(mess);
        //System.out.println(Arrays.toString(str));
        map.put("time",str[1]);  //表示修改的是哪天的实验室
        System.err.println("a"+str[0]+"b");
        if(str[0].length()!=0){
            String sections="";
            for(int i=0;i<str[0].length();i++){
                sections+=str[0].charAt(i)+",";
            }
            map.put("str","("+sections.substring(0,sections.length()-1)+")");   //字符串','隔开,每个字符表示节次
        }else{
            map.put("str","(-1)");
        }
        map.put("id",str[2]);    //表示所修改的实验室id
        return toAjax(labService.updateLabDate(map));
    }

    /**
     * 删除实验室某天的开放信息
     */
    @DeleteMapping("/deleteLabDate")
    @ResponseBody
    public AjaxResult deleteLabData(LabDateParam labDateParam){
        System.err.println(labDateParam);
        //删除某天开放信息时，确保是否有预约成功的教师
        List<Integer> status=labService.selectLabDate(labDateParam);
        //判断是否有为1的,即被教师预约的
        boolean flag=false;
        for(Integer s:status){
            if(s==1){
                flag=true;
            }
        }
        if(flag==true){
            return AjaxResult.error("当前有实验室预约信息，不能删除");
        }else{
            return toAjax(labService.deleteLabDateByTime(labDateParam));
            //return toAjax(true);
        }
    }


    @Autowired
    private TbClassTimeMapper tbClassTimeMapper;
    /**
     * 对某一个实验室 再次添加开放信息
     */
    @PostMapping("/againInsert")
    @ResponseBody
    public AjaxResult againInsert(LabAddParam labAddParam) throws ParseException {
        System.err.println(labAddParam);
        //获取节次信息
        //所有节次 信息  [1,2,3,4,5,6]
        List<TbClassTime> tbClassTimes=tbClassTimeMapper.selectTbClassTimeList();
        //存放状态信息
        List<Integer> status=new ArrayList<Integer>();
        //初始化状态信息
        for(TbClassTime a:tbClassTimes){
            status.add(0);      //[0,0,0,0,0,0]
        }
        if((labAddParam.getSectionEnd().get(0)-labAddParam.getSectionBegin().get(0))<0){
            return AjaxResult.error("请选择正确的节次范围");
        }
        //修改对应状态信息    将选中的节次改变为状态2
        for(int a=labAddParam.getSectionBegin().get(0);a<=labAddParam.getSectionEnd().get(0);a++){
            status.set(a-1,2);
        }
        //添加新的开放信息
        //日期格式化
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        //获取循环天数  即几月几号-几月几号天数
        Long diff=(df.parse(labAddParam.getExperimenEndtDate().get(0)).getTime()-df.parse(labAddParam.getExperimentBeginDate().get(0)).getTime())/ (1000 * 60 * 60 * 24);
        //创建空集合便于添加
        List<LabDateParam> labDateParams=new ArrayList<LabDateParam>();
        if(diff>=0) {
            //循环时间  即几月几号到几月几号
            for (int g = 0; g < diff + 1; g++) {
                //循环节次的状态
                 for(int i=0;i<status.size();i++){
                     //用来存放具体的时间节次状态信息
                     LabDateParam labDateParam=new LabDateParam();
                     //获取日历
                     Calendar c = Calendar.getInstance();
                     //格式化日期
                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                     //获取到开始的添加时开始的年月日
                     c.setTime(sdf.parse(labAddParam.getExperimentBeginDate().get(0)));
                     //添加天数
                     c.add(Calendar.DATE, g);
                     //设置值  id
                     labDateParam.setLabId(labAddParam.getId());
                     labDateParam.setOrderTime(c.getTime());
                     //节次
                     labDateParam.setSection((long) (i+1));
                     //对应节次的状态
                     labDateParam.setStatus(status.get(i));

                     /**
                      * 判断当前添加的时间节次是否重复
                      */
                     Long flag=tbClassTimeMapper.labDateIsExist(labDateParam);
                     if(flag!=null){
                         //重复则更新状态
                         //System.err.println(1);
                         tbClassTimeMapper.updateLabDateIsExist(labDateParam);
                     }else{
                         //不存在则添加
                         labDateParams.add(labDateParam);
                     }
                 }
            }
            //判断是否有添加新的时间
            if(StringUtils.isNull(labDateParams) || labDateParams.size()==0){
                return AjaxResult.success("执行成功");
            }else{
                tbClassTimeMapper.insertClassTime(labDateParams);
            }
        }else{
            return AjaxResult.warn("请选择正确的时间范围");
        }
        return toAjax(true);
    }
}

